697

I know the clear command that 'clears' the current screen, but it does this just by printing lots of newlines - the cleared contents just get scrolled up.

Is there a way to completely wipe all previous output from the terminal so that I can't reach it even by scrolling up?

4
  • 1
    Did you ever find a way to do this that works in a shell script? Commented Mar 8, 2014 at 23:47
  • 13
    @ZevEisenberg I don't think so. Anyway, now I think I don't need this at all. I am satisfied with Command+K.
    – eonil
    Commented Mar 9, 2014 at 1:56
  • @ZevEisenberg my updated answer (and one other answer) shows you how to do it from a script. Commented Aug 1, 2014 at 21:07
  • See apple.stackexchange.com/questions/31872/…
    – anishpatel
    Commented Oct 5, 2017 at 21:37

16 Answers 16

1354

To clear the terminal manually:

+K

Command+K for newer keyboards

To clear the terminal from within a shell script;

/usr/bin/osascript -e 'tell application "System Events" to tell process "Terminal" to keystroke "k" using command down'
9
  • @fearless_fool apple.stackexchange.com/a/31887 might do it? If it does, please let me know! Commented Oct 28, 2014 at 17:46
  • Well, yes, but see below (stackoverflow.com/a/26615036/558639) for a better way altogether. Commented Oct 29, 2014 at 0:48
  • 9
    If you accidentally pressed this, how would one go about viewing the cleared buffer? Commented Nov 4, 2014 at 19:41
  • 7
    @JoshPinter, just don't press it by accident. :) (Consider using clear for all cases except where you need the scrollback history to actually disappear, e.g. when you are going to print.)
    – Wildcard
    Commented Mar 18, 2016 at 7:02
  • 3
    @Wildcard Fair enough. :) Good advice on using clear. I feel like they should be reversed, though. Typing clear seems more intentional than hitting Command + K. Commented Mar 19, 2016 at 13:47
133

A better way to clear the screen from within a script...

If you're using the OS X Terminal app (as stated by the OP), a better approach (thanks to Chris Page's answer to How do I reset the scrollback in the terminal via a shell command?) is just this:

clear && printf '\e[3J'

or more concisely (hat tip to user qiuyi):

printf '\33c\e[3J'

which clears the scrollback buffer as well as the screen. There are other options as well. See Chris Page's answer to How do I reset the scrollback in the terminal via a shell command? for more information.

Original answer

The AppleScript answer given in this thread works, but it has the nasty side effect of clearing any terminal window that happens to be active. This is surprising if you're running the script in one window and trying to get work done in another!

You avoid this by refining the AppleScript to only clear the screen if it is frontmost by doing this (taken from MattiSG's answer to How do I reset the scrollback in the terminal via a shell command?):

osascript -e 'if application "Terminal" is frontmost then tell application "System Events" to keystroke "k" using command down'

... but as when it's not the current window, the output will stack up until it becomes current again, which probably isn't what you want.

7
  • 1
    I used the "better way" in .bash_profile and it's awesome because I no longer get the glitched buffer sometimes when opening a new terminal window. Commented Jan 28, 2015 at 9:49
  • 1
    This is the most conceptually correct answer. qiuyi's answer avoids the && at the sacrifice of a little readability. If Alok's answer could be extended to clear the terminal that is running the current script, it would be an improvement, but this simpler. Commented Dec 18, 2015 at 19:41
  • Is there a way to bind a command, eg, ctrl+l, to do the same thing as printf '\33c\e[3J' using .inputrc ?
    – kortina
    Commented Jul 21, 2020 at 20:31
  • 1
    I could not figure out with .inputrc but this worked in my .bash_profile: bind '"\C-k": "printf \\\\33c\\\\e[3;\n"'
    – kortina
    Commented Jul 21, 2020 at 20:58
  • The printf code works in the normal terminal app, but not in the built-in terminal of PHPStorm. Anyone knows why?
    – Philipp
    Commented Jan 12, 2021 at 17:38
89

To delete the last output only:

+ L

To clear the terminal completely:

+ K

5
  • Is there a way to clear the screen but still have the input be there if I scroll up above the fold?
    – Qasim
    Commented Jan 18, 2022 at 15:59
  • 1
    @Qasim Under Linux clear -x keeps scrollback intact, don't have a mac at hand to test there
    – Andreas
    Commented Apr 21, 2022 at 9:52
  • @Andreas I just tested it out in Zsh on macOS Catalina, and it does indeed work. Thanks!
    – Qasim
    Commented May 9, 2022 at 10:24
  • For iTerm2 users, Cmd + Alt + L can delete the last line. Commented Feb 9, 2023 at 0:44
  • For iTerm2 users, Cmd + Alt + L can delete the last line: superuser.com/a/1767681/114723 (called Clear to Previous Mark) Commented Feb 9, 2023 at 0:54
67

The pretty way is printf '\33c\e[3J'

6
  • 11
    This is the best way. We should define alias like alias cls='printf "\33c\e[3J"'
    – mpyw
    Commented Apr 27, 2015 at 16:11
  • Works in iTerm2 as well Commented May 31, 2017 at 7:09
  • 3
    @LoïcFaure-Lacroix, \33c performs the equivalent of the clear command, which basically just scrolls the screen until you can't see it's previous contents. It clears the screen, but not the scroll back buffer (i.e. you can still use the scroll bars to see the old output). Add the \e[3J to actually clear the scroll back buffer.
    – luiss
    Commented Sep 19, 2017 at 18:02
  • @EirNym, add function cls { printf '\33c\e[3J\33c' } line in ~/.profile (or system-wide /etc/profile). This should work for desktop environments in macOS, FreeBSD, Linux etc. Note the extra \33c is for clearing the extra \e[3J literal in non-macOS (basically for Linux/FreeBSD, we only need printf '\33c'). Commented Aug 8, 2019 at 16:16
  • @luiss What is the code \33c? Is there an official document for the full list of similar code's meaning in MacOS?
    – Richard
    Commented Mar 15, 2023 at 11:02
37

Put this in your .bash_profile or .bashrc file:

function cls {
    osascript -e 'tell application "System Events" to keystroke "k" using command down'
}
1
  • This answer still works great in Big Sur! It clears the output of the current terminal tab (other windows/tabs are not cleared)
    – Philipp
    Commented Jan 12, 2021 at 17:44
22

On Mac OS X Terminal, this functionality is already built in to the Terminal Application as menu ViewClear Scrollback (the default is CMD + K).

So you can re-assign this as you like with Apple's Keyboard shortcuts. Just add a new shortcut for Terminal with the command "Clear Scrollback". (I use CMD + L, because it's similar to Ctrl + L to clear the current screen contents, without clearing the buffer.)

I am not sure how you would use this in a script (maybe AppleScript as others have pointed out).

2
  • 1
    As of Yosemite (10.10), View->Clear Scrollback is no longer present in Terminal's menu. The keyboard shortcut CMD + K still works, though. Commented Sep 28, 2015 at 2:36
  • 2
    @NicolasMiari Looks like Clear Scrollback has just moved from View to Edit in Yosemite.
    – BrainSteel
    Commented Nov 8, 2015 at 22:03
11

With Mac OS X v10.10 (Yosemite), use Option + Command + K to clear the scrollback in Terminal.app.

9

Or you can send a page break (ASCII form feed) by pressing Ctrl + L.

While this technically just starts a new page, this has the same net effect as all the other methods, while being a lot faster (except for the Apple + K solution, of course).

And because this is an ASCII control command, and it works in all shells.

3
  • 1
    That clears the screen but leaves the scrollback buffer intact.
    – George
    Commented Jul 12, 2016 at 19:39
  • it is not the same if you want to use cmd + f for exemple
    – bormat
    Commented May 11, 2019 at 10:14
  • That's not how Control-L works in a shell. Shells bind the Control-L (Form Feed) input to a command that clears the screen in some appropriate way, which is not by sending a Form Feed to the terminal. Terminals treat FF just like New Line and advance the cursor one row. Shells usually use terminfo to look up the bytes to send to the terminal. That is usually clear=\E[H\E[2J, which moves the cursor to the home position (ESC [ H) and erases the display (ESC [ 2 J). This is why it's important to use the clear command instead of hard-coding the entire sequence when doing it programmatically.
    – Chris Page
    Commented Mar 31, 2023 at 18:58
9

Command + K will clear previous output.

To clear entered text, first jump left with Command + A and then clear the text to the right of the pointer with Control + K.

Visual examples:

Enter image description here

6
clear && printf '\e[3J'

clears out everything, and it works well on OS X as well. Very neat.

1
  • beautiful, I was just using clear which leaves some stuff when you scroll back up. no more! Commented Jan 18, 2021 at 5:53
6

Do the right thing; do the thing right!

Clear to previous mark: Command + L

Clear to previous bookmark: Option + Command + L

Clear to start: Command + K

3

Adding the following to your configuration file would get you a new command to do it.

alias clearwipe='printf "\33c\e[3J"'

After reload clearwipe would be the new command to completely wipe all previous output from the terminal so that you can't reach it even by scrolling up.

0

I couldn't get any of the previous answers to work (on macOS).

A combination worked for me -

IO.write "\e[H\e[2J\e[3J"

This clears the buffer and the screen.

2
  • 1
    What is IO.write? I had to replace it with printf to get it working. Thanks anyway. This one works best for me
    – Fitsyu
    Commented Jul 2, 2018 at 10:38
  • 1
    I'm not sure why I chose IO.write. It should work the same however you decide to print those characters to the terminal. Commented Jul 23, 2018 at 13:07
-2

This works on MacOS v13

tput reset
2
  • 2
    reset doesn't normally clear the scrollback, which is what this Q&A is about. It resets the terminal, which clears the screen. Resetting the terminal is usually undesirable.
    – Chris Page
    Commented Mar 31, 2023 at 19:06
  • 1
    mentioned command does clear all previous output as well as scrollback, that's what OP asked for. It's a different way to achieve the same.
    – GorvGoyl
    Commented Apr 1, 2023 at 7:49
-3

Typing the following in the terminal will erase your history (meaning using up arrow will get you nothing), but it will not clear the screen:

history -c
6
  • It does. @phil does it deletes them permanently from the disk, or are they still retrievable some way? Commented Jun 1, 2012 at 9:49
  • Basically it deletes the file ~/.bash_history, so if you can recover that, you can recover the commands that have been cleared Commented Jun 2, 2012 at 18:02
  • No it doesn't work. Scrolled up history still exist, and I can scroll up to see them again.
    – eonil
    Commented Sep 23, 2012 at 3:22
  • 29
    Not what was asked. This clears the history, not the current buffer, which are two very different things. Commented Feb 12, 2013 at 8:49
  • 2
    Not what was asked, and harmful; I was just bitten by this, and my history contained important stuff.
    – Elazar
    Commented Jul 26, 2018 at 22:58
-3

CMD + K works for macOS. It clears the entire terminal output, but the environment remains.

1
  • 6
    This is the same answer as the accepted one written 8 years ago. Commented Apr 2, 2018 at 21:12

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.